package com.linkgie.galaxyframework.security.ca;

import com.linkgie.galaxyframework.crypto.PublicKey;
import com.linkgie.galaxyframework.utils.bean.BeanProperty;

/**
 * 授权信息；
 * <p>
 * 注：将基于授权信息的内容是生成的密码地址作为证书ID；
 */
public interface Authorization {

    /**
     * 授予主体的公钥；
     * 
     * @return
     */
    @BeanProperty(converter = PublicKeyConverter.class)
    PublicKey getPublicKey();

    /**
     * 授予主体的标识；
     * 
     * @return
     */
    String getPrincipal();

    /**
     * 证书主题；
     * <p>
     * 包含签发此证书的相关信息的描述，例如证书用途、背景信息等；
     * 
     * @return
     */
    String getSubject();

    /**
     * 随机因子；
     * <p>
     * 使得证书的签发加入随机性；
     * 
     * @return
     */
    long getRandomKey();

    /**
     * 证书链传播距离；
     * <p>
     * 即以当前证书的主体以此证书为背书，签发下级证书的最大层级距离；
     * <p>
     * 证书链传播距离由根证书签发机构定义，并在每一层级的证书签发时至少递减 1 ，直至减少到 0；
     * <p>
     * 证书链传播距离为 0 的证书不能背书签发下一级证书；
     * 
     * @return
     */
    int getPropagationDistance();

    /**
     * 签发时间；
     * <p>
     * 自 1970 年（UTC) 1 月 1 日 0 点以来的毫秒数；
     * 
     * @return
     */
    long getIssueTime();

    /**
     * 签发者的证书ID；
     * 
     * <p>
     * 注：由于是将基于授权信息的内容是生成的密码地址作为证书ID，<br>
     * 所以，将签发者的证书ID加入到授权信息中，便使得当前证书ID与证书链的上级签发者证书ID形成了哈希链，哈希链的头部是根证书ID；
     * 
     * @return
     */
    String getIssueBy();

    /**
     * 有效期；
     * <p>
     * 单位：毫秒；
     * 
     * @return
     */
    long getLifetime();
}
